package com.aisile.common.exception;

import com.aisile.model.common.dtos.ResponseResult;
import com.aisile.model.common.enums.AppHttpCodeEnum;
import com.google.common.collect.ImmutableMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.script.ReactiveScriptExecutor;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 获取所有controller中的异常  公共异常处理类
 *
 * @Auther:yry
 * @Date:2024/4/24 0024
 * @VERSON:1.0
 */
@Slf4j
@ControllerAdvice // 当前这个类 就变成所有controller 通知类
//@RestControllerAdvice
public class ExceptionWorksHandler {

    // 1. 不能保证 返回的结果统一性（代码运行过程中 有人能改）
    // 2. HashMap 线程不安全
    /*static Map<Class<? extends Exception>, ResponseResult> responseResultMap = new HashMap<>();

    static {
        responseResultMap.put(NullPointerException.class, ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID));
    }*/

    public static ImmutableMap<Class<? extends Exception>, ResponseResult> EXCEPTIONS;
    public static ImmutableMap.Builder<Class<? extends Exception>, ResponseResult> builder =  ImmutableMap.builder();
    static {
        builder.put(NullPointerException.class,ResponseResult.errorResult(3000,"数据出现空数据了！"));
        builder.put(IndexOutOfBoundsException.class,ResponseResult.errorResult(3001,"数组出现越界情况！"));
        builder.put(NumberFormatException.class,ResponseResult.errorResult(3002,"数据转换失败，需要输入数值类型！"));
        builder.put(ArithmeticException.class,ResponseResult.errorResult(3003,"运算、数据计算出现问题！"));
        builder.put(IOException.class,ResponseResult.errorResult(3004,"文件转码出现问题！"));
        builder.put(HttpMessageNotReadableException.class,ResponseResult.errorResult(3005,"当前请求地址入参不能为空！"));
    }



    // 自定义异常（可预知异常）
    @ExceptionHandler(value = {CustomException.class})
    @ResponseBody
    public ResponseResult KnowEcxeption(CustomException e) {
        // 记录日志
        e.printStackTrace();
        // 处理异常格式
        return e.getResponseResult();
    }

    // 非自定义异常(不可预知异常)
    @ExceptionHandler(value = {Exception.class})
    @ResponseBody
    public ResponseResult NotKnowEcxeption(Exception e) {
        e.printStackTrace();
        //e.getClass()
        // 记录日志
        // 匹配异常类型 返回提前准备好的数据
        if( EXCEPTIONS == null){
            EXCEPTIONS = builder.build();
        }
        // 如果匹配到了  就返回
        // 如果没有匹配到 提示99999
        // 处理异常格式
        ResponseResult res =  EXCEPTIONS.get(e.getClass());
        if (res == null) {
            return ResponseResult.errorResult(99999, "出现不可预知异常，请联系管理员");
        }
        return res;
    }

}
